<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            padding-bottom: 800px;
        }
    </style>
</head>
<body>
    <div id="app">
        <div>
            <h4 ref="h4Dom">msg:{{ msg }}</h4>
            <input v-model="msg" type="text" />
            <h4 ref="h4Dom1">info:{{ info }}</h4>
            <input v-model="info" type="text" />
            <hr>
            <input type="button" value="卸载vue应用实例" @click="doUnmount()">
        </div>
    </div>
    <script type="module"> 
        import { createApp } from "../assets/vue3/vue.esm-browser.js";
        const app = createApp({
            data(){
                return {
                    msg:"测试数据消息msg",
                    info:"测试数据消息info"
                }
            },
            methods: {
                printMsg() {
                    console.log(this.msg)
                },
                doUnmount(){
                    app.unmount();
                }
            },
            // 生命周期钩子函数本身是在vue执行过程中被自动调用的方法
            // beforeCreate 表示开始完成 数据写入和劫持操作 ，created 表示写入完成，劫持完成
            beforeCreate () {
                console.group("beforeCreate==============>");
                console.log("$options",this.$options); // 输出vue实例构建的完成配置
                console.log("$data",this.$data);  // {} 因为响应式数据尚未完成劫持操作
                console.log("msg:",this.msg); // undefined 未定义
                console.log("printMsg:",this.printMsg); // undefined 未定义
                console.groupEnd()
            },
            created () {
                console.group("created==============>");
                console.log("$options",this.$options); // 输出vue实例构建的完成配置
                console.log("$data",this.$data);  // 返回对象，对象中记录被劫持的仓库数据
                console.log("msg:",this.msg); // '测试数据消息' 返回数据值
                console.log("printMsg:",this.printMsg); // 返回定义的方法
                console.log("$el:",this.$el); // null 没有当前vue实例对应的页面容器元素结构
                console.groupEnd()
            },
            beforeMount () {
                console.group("beforeMount==============>");
                console.log("$el:",this.$el); // null 没有当前vue实例对应的页面容器元素结构
                console.groupEnd()
            },
            mounted () {
                console.group("mounted==============>");
                console.log("$el:",this.$el); // 基于vue vnode DOM 功能构建的vue实例容器已创建完毕，且写入页面
                console.groupEnd()
            },
            // 上述生命周期钩子函数只会在第一次加载时 执行一次
            beforeUpdate () {
                console.group("beforeUpdate==============>");
                console.log("msg:",this.msg);
                console.log("$refs.h4Dom.textContent",this.$refs.h4Dom.textContent); 
                console.groupEnd()
            },
            updated () {
                console.group("updated==============>");
                console.log("msg:",this.msg);
                console.log("$refs.h4Dom.textContent",this.$refs.h4Dom.textContent); 
                console.groupEnd()
            },
            // vue2 的写法
            // beforeDestroy () {
            //     console.group("beforeDestroy==============>");
            //     console.groupEnd()
            // },
            // destroyed () {
            //     console.group("destroyed==============>");
            //     console.groupEnd()
            // },
            beforeUnmount(){
                console.group("beforeUnmount==============>");
                console.groupEnd()
            },
            unmounted(){
                console.group("unmounted==============>");
                console.groupEnd()
            }
        });
        app.mount("#app")
    </script>
</body>
</html>